In [ ]:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier 
from sklearn import tree
from sklearn import metrics
In [ ]:
df = pd.read_csv('vgsales_23.csv') 
df
Out[ ]:
Rank Name Platform Year Genre Publisher NA_Sales EU_Sales JP_Sales Other_Sales Global_Sales
0 14378 Hajime no Ippo: The Fighting! (2014) PS3 2014.0 Sports Namco Bandai Games 0.00 0.00 0.03 0.00 0.03
1 6926 Fallout 3 Game Add-On Pack: Broken Steel and P... X360 2009.0 Role-Playing Bethesda Softworks 0.16 0.06 0.00 0.02 0.24
2 3597 Monster High: Ghoul Spirit Wii 2011.0 Misc THQ 0.44 0.08 0.00 0.04 0.56
3 6546 Game of Thrones X360 2012.0 Role-Playing Focus Home Interactive 0.15 0.08 0.00 0.02 0.26
4 276 FIFA 12 X360 2011.0 Sports Electronic Arts 0.84 2.79 0.02 0.53 4.19
... ... ... ... ... ... ... ... ... ... ... ...
548 10081 Digimon World DS DS 2006.0 Role-Playing Namco Bandai Games 0.10 0.00 0.00 0.01 0.11
549 6708 Sentimental Graffiti SAT 1998.0 Adventure NEC Interchannel 0.00 0.00 0.25 0.00 0.25
550 11485 Tomb Raider: Underworld PC 2008.0 Action Eidos Interactive 0.00 0.06 0.00 0.02 0.08
551 4524 Wonder Project J: Kikai no Shonen Pino SNES 1994.0 Simulation Enix Corporation 0.00 0.00 0.43 0.00 0.43
552 398 WWF War Zone PS 1998.0 Fighting Acclaim Entertainment 2.47 0.76 0.00 0.13 3.36

553 rows × 11 columns

In [ ]:
from sklearn.preprocessing import OrdinalEncoder


OEnc = OrdinalEncoder()

# Обучение OrdinalEncoder на уникальных значениях столбца "Genre"
OEnc.fit(df[["Platform"]])

transformed_data = OEnc.transform(df[["Platform"]])

df[["Platform"]] = OEnc.transform(df[["Platform"]]) #Перенос преобразованных данных в изначальный датасет
df #Вывод данных из датасета
Out[ ]:
Rank Name Platform Year Genre Publisher NA_Sales EU_Sales JP_Sales Other_Sales Global_Sales
0 14378 Hajime no Ippo: The Fighting! (2014) 13.0 2014.0 Sports Namco Bandai Games 0.00 0.00 0.03 0.00 0.03
1 6926 Fallout 3 Game Add-On Pack: Broken Steel and P... 21.0 2009.0 Role-Playing Bethesda Softworks 0.16 0.06 0.00 0.02 0.24
2 3597 Monster High: Ghoul Spirit 19.0 2011.0 Misc THQ 0.44 0.08 0.00 0.04 0.56
3 6546 Game of Thrones 21.0 2012.0 Role-Playing Focus Home Interactive 0.15 0.08 0.00 0.02 0.26
4 276 FIFA 12 21.0 2011.0 Sports Electronic Arts 0.84 2.79 0.02 0.53 4.19
... ... ... ... ... ... ... ... ... ... ... ...
548 10081 Digimon World DS 3.0 2006.0 Role-Playing Namco Bandai Games 0.10 0.00 0.00 0.01 0.11
549 6708 Sentimental Graffiti 17.0 1998.0 Adventure NEC Interchannel 0.00 0.00 0.25 0.00 0.25
550 11485 Tomb Raider: Underworld 10.0 2008.0 Action Eidos Interactive 0.00 0.06 0.00 0.02 0.08
551 4524 Wonder Project J: Kikai no Shonen Pino 18.0 1994.0 Simulation Enix Corporation 0.00 0.00 0.43 0.00 0.43
552 398 WWF War Zone 11.0 1998.0 Fighting Acclaim Entertainment 2.47 0.76 0.00 0.13 3.36

553 rows × 11 columns

In [ ]:
df_encoded = pd.get_dummies(df, columns=['Name'])
df_encoded = df_encoded.dropna() 
df_encoded["Platform"] = np.where(df_encoded["Platform"] == 21.0, 1, 0)
df_encoded
Out[ ]:
Rank Platform Year Genre Publisher NA_Sales EU_Sales JP_Sales Other_Sales Global_Sales ... Name_X-Men Legends II: Rise of Apocalypse Name_X-Men Origins: Wolverine - Uncaged Edition Name_Xia-Xia Name_Yakuza Name_Yu-Gi-Oh! Forbidden Memories (JP sales) Name_ZhuZhu Pets Name_Zombi Daisuki Name_Zoo Resort 3D Name_ZooCube Name_Zumba Fitness
0 14378 0 2014.0 Sports Namco Bandai Games 0.00 0.00 0.03 0.00 0.03 ... False False False False False False False False False False
1 6926 1 2009.0 Role-Playing Bethesda Softworks 0.16 0.06 0.00 0.02 0.24 ... False False False False False False False False False False
2 3597 0 2011.0 Misc THQ 0.44 0.08 0.00 0.04 0.56 ... False False False False False False False False False False
3 6546 1 2012.0 Role-Playing Focus Home Interactive 0.15 0.08 0.00 0.02 0.26 ... False False False False False False False False False False
4 276 1 2011.0 Sports Electronic Arts 0.84 2.79 0.02 0.53 4.19 ... False False False False False False False False False False
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
548 10081 0 2006.0 Role-Playing Namco Bandai Games 0.10 0.00 0.00 0.01 0.11 ... False False False False False False False False False False
549 6708 0 1998.0 Adventure NEC Interchannel 0.00 0.00 0.25 0.00 0.25 ... False False False False False False False False False False
550 11485 0 2008.0 Action Eidos Interactive 0.00 0.06 0.00 0.02 0.08 ... False False False False False False False False False False
551 4524 0 1994.0 Simulation Enix Corporation 0.00 0.00 0.43 0.00 0.43 ... False False False False False False False False False False
552 398 0 1998.0 Fighting Acclaim Entertainment 2.47 0.76 0.00 0.13 3.36 ... False False False False False False False False False False

545 rows × 532 columns

In [ ]:
Y = df_encoded["Platform"]  # Выделение столбца "Platform" в переменную Y, которая будет содержать целевую переменную
X = df_encoded.drop(columns=["Platform", "Genre", "Publisher"])  # Создание переменной X, содержащей все столбцы, кроме "Platform", в качестве признаков

# Разделение данных на обучающую и тестовую выборки
# X_train и Y_train - обучающие признаки и целевая переменная
# X_test и Y_test - тестовые признаки и целевая переменная
# test_size = 0.2 означает, что 20% данных будут отведены для тестовой выборки
# random_state = 42 гарантирует воспроизводимость результатов
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
In [ ]:
dtc = DecisionTreeClassifier();

dtc = dtc.fit(X_train, Y_train);

from sklearn import tree
plt.figure(figsize=(60,60),dpi=300);
tree.plot_tree(dtc,filled=True, fontsize = 20);
In [ ]:
Y_predict = dtc.predict(X_test) #Проводим предсказание, по которому будем сверять
In [ ]:
#sns.heatmap(con_mat, annot=True, fmt="d"); #Создание тепловой карты на основе матрицы ошибок
plt.xlabel("Прогнозируемо"); #Подпись на оси Х на тепловой карте
plt.ylabel("Фактически"); #Подпись на оси Y на тепловой карте
In [ ]:
metrics.accuracy_score(Y_test, Y_predict)
Out[ ]:
0.926605504587156
In [ ]:
metrics.recall_score(Y_test, Y_predict)
Out[ ]:
0.14285714285714285
In [ ]:
metrics.f1_score(Y_test, Y_predict)
Out[ ]:
0.2
In [ ]:
Y = df_encoded["Platform"]  # Выделение столбца "Platform" в переменную Y, которая будет содержать целевую переменную
X = df_encoded.drop(columns=["Platform", "Genre", "Publisher"])  # Создание переменной X, содержащей все столбцы, кроме "Platform", в качестве признаков

# Разделение данных на обучающую и тестовую выборки
# X_train и Y_train - обучающие признаки и целевая переменная
# X_test и Y_test - тестовые признаки и целевая переменная
# test_size = 0.2 означает, что 20% данных будут отведены для тестовой выборки
# random_state = 42 гарантирует воспроизводимость результатов
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
In [ ]:
dtc_plot = DecisionTreeClassifier(max_depth=5,min_samples_leaf=5,max_leaf_nodes=200) #Создание объекта класса "DecisionTreeClassifier" с заданными параметрами
dtc_plot = dtc_plot.fit(X_train, Y_train) #Обучение модели на тренировочных данных, которые были подготовлены ранее
In [ ]:
plt.figure(figsize=(60,60),dpi=300); #Создание фигуры для вывода дерева
tree.plot_tree(dtc_plot,filled=True, fontsize = 10); #Вывод дерева решений без надстроек
In [ ]:
Y_predict = dtc.predict(X_test) #Проводим предсказание, по которому будем сверять
In [ ]:
con_mat = metrics.confusion_matrix(Y_test, Y_predict) #Создание матрицы ошибок
con_mat #Вывод данных из переменной
Out[ ]:
array([[100,   2],
       [  6,   1]], dtype=int64)
In [ ]:
sns.heatmap(con_mat, annot=True, fmt="d"); #Создание тепловой карты на основе матрицы ошибок
plt.xlabel("Прогнозируемо"); #Подпись на оси Х на тепловой карте
plt.ylabel("Фактически"); #Подпись на оси Y на тепловой карте
In [ ]:
metrics.accuracy_score(Y_test, Y_predict)
Out[ ]:
0.926605504587156
In [ ]:
metrics.recall_score(Y_test, Y_predict)
Out[ ]:
0.14285714285714285
In [ ]:
metrics.f1_score(Y_test, Y_predict)
Out[ ]:
0.2